package views.mediators {
  import com.axon.base.helpers.AxFailure;
  import com.axon.base.managers.AxErrorManager;
  import com.axon.base.managers.AxPopUpManager;
  import com.axon.mvc.helpers.AxVerbs;
  import com.axon.mvc.patterns.mediator.AxMediator;

  import flash.display.DisplayObject;

  import helpers.Constants;
  import helpers.ListaPleitos;

  import models.vo.Estado;
  import models.vo.Incentivo;
  import models.vo.Pleito;

  import mx.collections.ArrayCollection;
  import mx.containers.TabNavigator;
  import mx.utils.StringUtil;

  import views.components.PleitoListaConsultaView;

  public class PleitoListaConsultaMediator extends AxMediator {
    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function PleitoListaConsultaMediator(viewComponent:DisplayObject) {
      super(viewComponent);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function get view():PleitoListaConsultaView {
      return viewComponent as PleitoListaConsultaView;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    override protected function initialize():void {
      regBroadcastInterests([AxVerbs.REFRESH]);
      regResponseInterest(Pleito, [AxVerbs.LIST]);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventViewShow():void {
      // Status
      view.listaStatus = new ArrayCollection;
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_TUDO, label: "Todos"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_ANALISE, label: "Análise"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_APROVADO, label: "Aprovado"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_ARQUIVADO, label: "Arquivado"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_CERTIFICACAO, label: "Certificação"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_DELIBERACAO, label: "Deliberação"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_DISTRIBUICAO, label: "Distribuição"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_INSCRICAO, label: "Inscrição"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_RECOMENDACAO, label: "Recomendação"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_REJEITADO, label: "Rejeitado"});
      view.listaStatus.addItem({id: Constants.STATUS_PLEITO_TRIAGEM, label: "Triagem"});
      view.cmbStatus.selectedIndex = 0;
      // Incentivo
      view.listaIncentivo = new ArrayCollection;
      view.listaIncentivo.addItem({id: Constants.TUDO, label: "Todos"});
      for each (var incentivo:Incentivo in AppFacade.getInstance().models.incentivos) {
        view.listaIncentivo.addItem({id: incentivo.mnemonic, label: incentivo.descricao});
      }
      view.cmbIncentivo.selectedIndex = 0;
      // Tipo Projeto
      view.listaTipoProjeto = new ArrayCollection;
      view.listaTipoProjeto.addItem({id: Constants.TUDO, label: "Todos"});
      view.listaTipoProjeto.addItem({id: "ampliacao", label: "Ampliação"});
      view.listaTipoProjeto.addItem({id: "diversificacao", label: "Diversificação"});
      view.listaTipoProjeto.addItem({id: "implantacao", label: "Implantação"});
      view.listaTipoProjeto.addItem({id: "modernizacao_parcial", label: "Modernização Parcial"});
      view.listaTipoProjeto.addItem({id: "modernizacao_total", label: "Modernização Total"});
      view.cmbTipoProjeto.selectedIndex = 0;
      // Uf
      view.listaUF = new ArrayCollection;
      view.listaUF.addItem({id: Constants.TUDO, label: "Todas"});
      for each (var estado:Estado in AppFacade.getInstance().models.estados) {
        view.listaUF.addItem({id: estado.id, label: estado.uf});
      }
      view.cmbUF.selectedIndex = 0;
      // Focus
      view.cmbStatus.setFocus();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventDataChange(body:Object):void {
      view.adgMain.dataProvider = null;
      AppFacade.getInstance().pleitoProxy.listaConsulta.needRefresh = true;
      if (body == view.cmbIncentivo)
        view.showTipoProjeto = (view.cmbIncentivo.selectedItem.id == "red_75_irpj")
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventList():void {
      var search:Object = new Object;
      var criterion:*;

      if ((criterion = view.cmbStatus.selectedItem.id) != Constants.STATUS_PLEITO_TUDO)
        search["search[status]"] = criterion;
      if ((criterion = view.cmbIncentivo.selectedItem.id) != Constants.TUDO)
        search["search[incentivo_mnemonic_equals]"] = criterion;
      if ((criterion = view.cmbTipoProjeto.selectedItem.id) != Constants.TUDO)
        search["search[caracterizacao_tipo_projeto_equals]"] = criterion;
      if ((criterion = view.cmbUF.selectedItem.id) != Constants.TUDO)
        search["search[empreendimento_pj_objeto_contato_municipio_estado_id_equals]"] = criterion;

      // TODO separar por espaços e usar like_any
      if ((criterion = StringUtil.trim(view.txtRazaoSocial.text)) != "")
        search["search[empreendimento_pj_objeto_razao_social_like]"] = criterion;
      if ((criterion = view.txtCnpj.text.replace(/\D/g, "")) != "")
        search["search[empreendimento_pj_objeto_cnpj_like]"] = criterion;

      var hasCriteria:Boolean = false;
      for (var key:*in search) {
        hasCriteria = true;
        break;
      }
      if (!hasCriteria) {
        AxPopUpManager.messageDlg("Forneça pelo menos um dos critérios de pesquisa.", "Advertência");
        return;
      }

      callController(Pleito, AxVerbs.LIST, Constants.MNEMONICO_LISTA_CONSULTA, search);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function eventEnableGestures():void {
      view.pbAbrir.enabled = (view.selectedPleito != null);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function brcastRefresh(sender:Object, body:Object, extraInfo:Object):void {
      AppFacade(facade).pleitoProxy.listaConsulta.invalidate();

      if ((view.parent is TabNavigator) && ((view.parent as TabNavigator).selectedChild == view))
        eventViewShow();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function respPleitoListSuccess(sender:Object, body:Object, extraInfo:Object):void {
      if (body == AppFacade(facade).pleitoProxy.listaConsulta) {
        view.adgMain.dataProvider = (body as ListaPleitos).modelsCollection;
        view.adgMain.axRecallLastSelection();
      }
    }

    public function respPleitoListFailure(sender:Object, body:Object, extraInfo:Object):void {
      if (body == AppFacade(facade).pleitoProxy.listaConsulta)
        AxErrorManager.showFailure(new AxFailure("Falha no carregamento da lista de pleitos em consulta."));
    }

  }
}